Глава 20

Язык CFScript

До сих пор при формировании того или иного кода мы применяли набор тегов с целью продемонстрировать возможности языка CFML. Однако все тот же ColdFusion позволяет писать программы, используя встроенный язык CFScript, по своему синтаксису похожий на JavaScript. При этом CFScript позволяет заменять "тяжелые" конструкции, написанные с помощью языка CFML. Для применения же CFScript достаточно расположить необходимый код внутри тега <CFSCRIPT>.

Тег <CFSCRIPT>

Синтаксис:

<CFSCRIPT>

Код CFScript </CFSCRIPT>

Например, объявление одномерного массива с помощью CFML-тегов можно записать так:

<CFSET CrArray = ArrayNew(l)> <CFSET CrArray[1] = "Harlem">

<CFSET CrArray[2] = "Brooklyn Br.">

При использовании CFScript ту же задачу можно реализовать следующим образом:

<CFSCRIPT>

CrArray = ArrayNew(1) ;

CrArray[1] = "Harlem";

CrArray[2] = "Brooklyn Br."; </CFSCRIPT>

Обратите внимание, что ColdFusion позволяет легко сочетать CFML-теги и CFScript-сценарии. К примеру, несколько усложним представленный выше ход и сравним варианты фрагментов программ с использованием CFML-тегов и CFScript (табл. 20.1).

Таблица 20.1, Примененияе CFML-тегов и CFScript

Вариант программы

Код

С использованием CFML-тегов

<CFSET Title = "My-Line Cruises">

<CFSET CrArray = ArrayNew(l)>

<CFSET CrArray [1] = "Harlem">

<CFSET CrArray [2] = "Brooklyn Br.">

<CFOUTPUT> lTitle#<br> </CFOUTPUT>

С использованием CFScript

<CFSCRIPT> Title = "My-Line Cruises"; CrArray = ArrayNew ( 1 ) ; CrArray[l] = "Harlem"; CrArray [2] = "Brooklyn Br."; WriteOutput (Title & "<br>"); </CFSCRIPT>

Вывод на экран списка элементов независимо от способа объявления массива

<CFIF IsArray (CrArray) AND ArraylsEmpty (CrArray) eq false> <CFLOOP INDEX = "i" FROM = "1" TO = lArrayLen (CrArray) #> <CFOUTPUT>#i#. #CrArray[i]#</CFOUTPUTXbr> </CFLOOP> %

 

Общие сведения о языке CFScript

CFScript поддерживает все функции и операторы, используемые в CFML. Если справочник функций CFML представлен в. приложении 3, то операторы CFML подробно рассмотрены в главе 8. Так же CFScript поддерживает любые типы переменных ColdFusion, рассмотренные в главе 9.

При использовании CFScript можно применять две разновидности комментариев: однострочные и многострочные. Комментарии, занимающие одну строку, начинаются, как в Java или JavaScript, с символов // и заканчиваются в конце строки. Такой стиль удобен для размещения кратких пояснений к отдельным строкам кода. Для более подробных пояснений можно воспользоваться комментариями, расположенными на нескольких строках, начав текст комментариев символами /* и закончив символами */. При этом весь текст между указанными парами символов будет расценен как комментарий.

Например:

<CFSCRIPT> /*

Преобразование температуры воздуха из градусов по Фаренгейту (F) в градусы по Цельсию (С)

*/

Value = 70; // Значение температуры по Фаренгейту (F)

Val = (Value-32)*5/9; Measurement = " С";

Result = NumberFormat(Val, "___•_") s Measurement;

WriteOutput(Result); // Результат температуры по Цельсию (С) </CFSCRIPT>

приведенном примере использована одна из функций CFML — NumberFormat, позволяющая форматировать числовые величины по заданной маске.

Отметим, что все операторы в CFScript заканчиваются точкой с запятой (,-), разрывы строк в коде игнорируются, и CFScript нечувствителен к регистру при выполнении сценария.

Так же, как и в JavaScript, CFScript позволяет использовать собственные функции, по своему синтаксису идентичные JavaScript. Определение функции начинается с ключевого слова function, далее следует имя функции, и вся конструкция заканчивается круглыми скобками с необязательным перечислением передаваемых параметров внутри этих скобок, а блок кода функции определяется фигурными скобками.

Синтаксис определения функции таков:

function MyFunctionName([paramNamel[, paramName2...]])

{Тело функции }

Например: <CFSCRIPT>

function Temperature(Value, CtoF) {

if (isNumeric(Value) and isBoolean(CtoF)) {

if (YesNoFormat(CtoF) EQUAL "Yes") { Val = Value*1.8+32; Measurement = " F"; } else {

Val = (Value-32)*5/9;

Measurement = " С"; }

Result =-NumberFormat(Val, "___._") & Measurement;

} else {

Result = "Error"; }

return Result; }

WriteOutput("Temperature: " & Temperature(12,"Yes")); </CFSCRIPT>

В результате выполнения приведенного примера с помощью функции WriteOutput будет выведена надпись "Temperature:" вместе с результатом работы указанной функции в соответствии с передаваемыми параметрами.

Причем в данном примере мы использовали такие операторы CFScnpt, как if. . .else и return. Оператор if. . .else позволяет в зависимости от некоторого логического значения производить те или иные действия (раздел else необязателен). В качестве логического выражения можно указывать выражение с операторами отношения. Это позволяет выводить ту или иную ветвь кода в зависимости от результатов сравнения'.

Оператор return используется только внутри блока функций и предназначен для немедленного завершения работы функции и передачи управления коду, вызывающему эту функцию. Оператор return может записываться с необязательной переменной в качестве возвращаемого значения так, как это показано в нашем примере.

Помимо уже упомянутых операторов if...else и return в CFScript также существуют следующие операторы: while, do. . .while, for, for. . .in, break, continue, switph/case и var. Давайте познакомимся с каждым из них.

П Оператор while представляет цикл многократного выполнения до тех пор, пока значение логического выражения равно True (истина). Ниже приведен пример для вывода таблицы соответствия температуры воздуха по Цельсию (С) и по Фаренгейту (F) с возможностью определения границы вывода с помощью оператора while:

<CFSCRIPT>

WriteOutput('<table><tr><td>C</td><td>F</td></tr>');

С = 10;

while ( с LT 40) {

f = c*1.8+32;

WriteOutput ('<tr><td>' & с & '</td><td>' & f & '</td></tr>') ;

c=c+ 10;

}

WriteOutput ( ' </table> ' ) ; </CFSCRIPT>

В результате выполнения данного кода будет выведена следующая информация:

С F 10 50 20 68 30 86

Оператор do... while является разновидностью оператора цикла, но в отличие от предыдущего оператора проверяет условие за'вершения в конце очередного прохода по телу цикла, а не перед ним. Для вывода информации, полученной в результате выполнения предыдущего примера, следует выполнить код:

<CFSCRIPT>

WriteOutput ( '<table><tr><td>C</td><td>F</tdx/tr>' ) ;

с = 10; do {

f = c*1.8+32;

WriteOutput (' <tr><td> ' & с & '</td><td>' & f & '</td></tr>' ) ;

с = с + 10; }

while ( с LT 40) ; WriteOutput ( ' </table> ' ) ; </CFSCRIPT>

Оператор for также является разновидностью оператора цикла. В нем предусмотрено определение инициализации переменной, условия завершения цикла и код, выполняемый при каждой итерации, чаще всего используемый для наращивания переменной. Перечисленные части оператора for указываются через точку с запятой. Например:

<CFSCRIPT>

for (i=10; i LTE 30; i=i+5) {

WriteOutput (i & "<br>"); } </CFSCRIPT>

В результате выполнения данного кода будет выведен список значений переменной i от 10 до 30 с шагом 5.

for. . . in: <CFSCRIPT>

TravelerStruct = StructNew ( ) ;

TravelerStruct. RS1_98 = "Nomar Garciaparra";

TravelerStruct. RS2_98 = "Pedro Martinez";

for (trvl in TravelerStruct) {

WriteOutput (trvl & " " & TravelerStruct [trvl] & "<br>") ; } </CFSCRIPT>

В результате выполнения данного кода будет выведена следующая информация:

RS1_98 Nomar Garciaparra RS2_98 Pedro Martinez

<CFSCRIPT>

for (i=10; i LTE 30; i=i+5) { WriteOutput (i & "<br>");

if (i EQ 20) { break;

}

</CFSCRIPT>

Несмотря на то, что в приведенном выше примере завершение цикла предполагается после того, как переменная i достигнет значения 30, оператор break прекратит выполнение цикла при указанном условии (в данном примере при значении переменной i, равном 20).

<CFSCRIPT>

for (i=10; i LTE 30; i=i+5) { if (i EQ 20) {

continue; }

WriteOutput(i & "<br>"); } </CFSCRIPT>

В результате выполнения данного кода будет выведен список значений переменной i от 10 до 30 с шагом 5 с пропуском значения 20.

<CFSCRIPT>

switch (DayOfWeek(now() ) ) { case 2: { // Monday

DinnerPlace = "Vong";

break; } case 3: { // Tuesday

DinnerPlace = "San Domenico";

break; } case 4: { // Wednesday

DinnerPlace = "Felidia";

break;

case 5: { // Thursday

DinnerPlace = "Le Cirque";

break; } case 6: { // Friday

DinnerPlace = "Russian Tea Room"

break; } default: { // Free days

DinnerPlace = "Home";

break;

}

WriteOutput ("Today I have dinner in: " & DinnerPlace); </CFSCRIPT>

Представленный пример позволяет выводить определенную информацию в зависимости от текущего дня недели. Заметим, что синтаксис оператора switch/case позволяет определять программный код для нерассмотренных вариантов, используя при этом необязательный блок default, как показано в приведенном выше примере.

<CFSCRIPT>

function Multiplication (x, у) { var Result = x * у;

return Result;

}

WriteOutput ("x * у = " & Multiplication (11, 7});

</CFSCRIPT>

В CFScript, как и в любом другом языке, существует понятие зарезервированных ключевых слов. Эти ключевые слова совместно с синтаксисом oпeраторов и разделителей входят в описание языка CFScript. Они могут применяться только по назначению, их нельзя использовать в качестве идентификаторов для имен переменных или функций. Как уже можно догадаться, в дополнение к наименованиям функций и операторов языка CFML также в список зарезервированных слов языка CFScript входят: if, else, return, do, while, for, in, break, continue, switch, case, default, var.

Заметим, что внутри блока <CFSCRIPT> не следует использовать CFML-теги. И еще: в отличие от JavaScript, в CFScript недопустимо обращение к некоторым неявным объектам, таким как window и document.